//导入模块
var express = require('express');
var cookieParser = require('cookie-parser');
var path = require('path');
const db = require('./db/db');
const session = require('express-session');
const MongoStore = require('connect-mongo');
//引入数据库配置文件
const { DBHOST, DBPORT, DBNAME } = require('./config/config');

db(() => {
  //导入路由模块
  var indexRouter = require('./routes/web/index');//网页路由
  var accountRouter = require('./routes/api/account.js');//用户账号路由
  var registerRouter = require('./routes/web/register.js');//注册路由
  var logRouter = require('./routes/api/log.js');

  //创建应用
  var app = express();
  

  //session配置
  app.use(session({
    name: 'sid',   //设置cookie的name，默认值是：connect.sid
    secret: 'atguigu', //参与加密的字符串（又称签名）  加盐
    saveUninitialized: false, //是否为每次请求都设置一个cookie用来存储session的id
    resave: true,  //是否在每次请求时重新保存session  20 分钟    4:00  4:20
    store: MongoStore.create({
      mongoUrl: `mongodb://${DBHOST}:${DBPORT}/${DBNAME}` //数据库的连接配置
    }),
    cookie: {
      httpOnly: true, // 开启后前端无法通过 JS 操作
      maxAge: 1000 * 60 * 60 * 24 * 7 // 这一条 是控制 sessionID 的过期时间的！！！---一周
    },
  }))

  //设置模版引擎和模版存放的目录
  app.set('views', path.join(__dirname, 'views'));//设置模版存放的目录
  app.set('view engine', 'ejs');//设置模版引擎

  //设置静态文件目录
  app.use(express.json());
  app.use(express.urlencoded({ extended: false }));
  app.use(cookieParser());
  app.use(express.static(path.join(__dirname, 'public')));

  //使用路由
  app.use('/', indexRouter);
  app.use('/', registerRouter);
  app.use('/api', accountRouter);
  app.use('/api', logRouter);

  // catch 404 and forward to error handler
  app.use((req, res) => {
    res.status(404).send('<h1>404 Not Found</h1>');
  });

  //错误处理中间件
  app.use(function (err, req, res, next) {
    // set locals, only providing error in development
    res.locals.message = err.message;
    res.locals.error = req.app.get('env') === 'development' ? err : {};

    // render the error page
    res.status(err.status || 500);
    res.render('error');
  });
  //启动服务
  app.listen(3000, () => {
    console.log('服务已经启动, 端口 3000 正在监听中....')
  })
}, () => {
  console.log('数据库连接失败')
})

/////不足之处  在后续对每个用户建立自己的数据库collections 动态设计
//session的作用： 确定是你
//session和cookie都是存储在服务端的，但是cookie是存储在客户端的
//token的作用： 确定你是谁
//token是存储在客户端的，并且是加密的